/*
 * ISubProgram.h
 * * 这是所有子程序的抽象基类（接口）。
 * 任何想要被母程序加载的子程序都必须继承这个类，
 * 并实现其所有的纯虚函数。
 */

#pragma once // 防止重复包含

class ISubProgram {
public:
    /**
     * @brief 虚析G构函数。
     * 确保通过基类指针删除派生类实例时，能正确调用析构函数。
     */
    virtual ~ISubProgram() {}

    /**
     * @brief 获取子程序的名称。
     * @return const char* 程序的名称（用于OLED菜单显示）。
     */
    virtual const char* getName() = 0;

    /**
     * @brief 子程序的初始化函数。
     * 当程序被选中加载时，母程序将调用此函数一次。
     * 作用等同于子程序自己的 setup()。
     */
    virtual void sub_setup() = 0;

    /**
     * @brief 子程序的循环函数。
     * 在程序运行时，母程序将在其主循环中反复调用此函数。
     * **[重要!]** 此函数必须是非阻塞的 (不能使用 delay() 或
     * 长的 while 循环)，否则将卡住整个系统。
     */
    virtual void sub_loop() = 0;

    /**
     * @brief 子程序的清理函数。
     * 当用户选择切换到另一个程序（或返回菜单）时，
     * 母程序将调用此函数，用于释放资源（例如 detachInterrupt）。
     */
    virtual void sub_cleanup() = 0;
};